﻿Imports Microsoft.VisualBasic
Imports System.Data

Namespace Clases
    Public Class DataBase

        'Conexion a base de datos desde el webconfig	
        Private Cx As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConfigurationManager.AppSettings("dbIP"))
        Dim CMD As SqlClient.SqlCommand
        Dim DR As SqlClient.SqlDataReader
        Dim DA As SqlClient.SqlDataAdapter
        Dim dbConn As New SqlClient.SqlConnection


        ''' <summary>
        ''' Ejecuta un Stored procedure, que manda un mail
        ''' </summary>
        ''' <param name="stored">Nombre del stored procedure que se ejecutara</param>
        ''' <param name="id">id del registro del cual se obtendran datos para llenar el correo</param>
        ''' <param name="opcion">Dentro del stored habra mas de un template de correo y con esta opcion sabremos cual tenemos que enviar.</param>
        ''' <remarks></remarks>
        Public Sub SendMail(ByVal stored As String, ByVal id As Integer, ByVal opcion As Integer)
            Dim Cmd As SqlClient.SqlCommand
            Dim Q As String

            Q = stored & " " & id & "," & opcion & ""

            Cmd = New SqlClient.SqlCommand(Q, Cx)
            Cmd.Connection.Open()
            Cmd.ExecuteNonQuery()
            Cmd.Connection.Close()
        End Sub



        ''' <summary>
        ''' Recupera un dato aislado por medio de una consulta DML
        ''' </summary>
        ''' <param name="comando">Sentencia DML de la cual se extraer� la informaci�n</param>
        ''' <param name="campo">Nombre del campo o alias del que se extraer� el dato</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function getSimpleData(ByVal comando As String, ByVal campo As String)
            Dim datoExtraido As String = Nothing

            Cx.Open()
            CMD = New SqlClient.SqlCommand(comando, Cx)
            CMD.CommandTimeout = "10000"
            DR = CMD.ExecuteReader

            If DR.Read Then
                If DR.Item(campo) Is DBNull.Value Then
                    datoExtraido = ""
                Else
                    datoExtraido = DR.Item(campo)
                End If
            End If
            Cx.Close()

            Return datoExtraido
        End Function



        ''' <summary>
        ''' Descripcion: Rutina que llena un arreglo con DML�s para ser executados por el execute_commandsArray Nota:ver siguiente funcion.
        ''' </summary>
        ''' <param name="StringArray">Arreglo donde se iran guardando los DML�s a ejecutar</param>
        ''' <param name="charString"> Sera el comando sql que se guardara en el arreglo</param>
        ''' <remarks>

        Public Sub addStringToArray(ByRef StringArray() As String, ByVal charString As String)
            Dim arrayIndex As Integer

            On Error Resume Next
            arrayIndex = StringArray.Length

            ReDim Preserve StringArray(arrayIndex)
            StringArray(arrayIndex) = charString

        End Sub


        ''' <summary>
        ''' Funcion que ejecuta un arreglo de DML controlado por transacciones.
        ''' </summary>
        ''' <param name="comandos">Arreglo de sentencias DML</param>
        ''' <param name="etiqueta">Nombre del control del tipo label en la que se imprimir� el error devuelto por la
        ''' transacci�n en caso de existir</param>
        ''' <returns>Devuelve OK si la transacci�n se completo son errores. NOK si hubo errores en la transacci�n</returns>
        ''' <remarks></remarks>
        Public Function execute_commandsArray(ByVal comandos() As String, ByRef etiqueta As Label)
            Dim x As Integer
            Cx.Open()

            Dim SQLTrans As SqlClient.SqlTransaction = Cx.BeginTransaction()
            CMD = Cx.CreateCommand
            CMD.Transaction = SQLTrans

            Try
                For x = 0 To (comandos.Length - 1)
                    CMD.CommandText = comandos(x)
                    CMD.ExecuteNonQuery()
                Next
                SQLTrans.Commit()
                Cx.Close()
                Return "OK"
            Catch ex As Exception
                Try
                    SQLTrans.Rollback()
                    etiqueta.Visible = True
                    etiqueta.ForeColor = Drawing.Color.Red
                    etiqueta.Text = "Error prevented: " & ex.Message
                    Cx.Close()
                Catch exRollback As Exception
                    etiqueta.Visible = True
                    etiqueta.ForeColor = Drawing.Color.Red
                    etiqueta.Text = "Error prevented: " & exRollback.Message
                    Cx.Close()
                    Return exRollback.Message()
                End Try
            End Try
            Cx.Close()
            Return Nothing
        End Function



        'funcion que busca valores de un recordset y los organiza en una sola cadena en donde se especifica
        'el simbolo que engloba y el simbolo separador ejemplo: 'a','b','c' .... 6,46,19,36
        ''' <summary>
        ''' Funcion que extrae todos los valores de un recordset y los organiza en una sola cadena donde se especifica el s�mbolo que
        ''' engloba cada elemento y el separador de los mismos en la cadena
        ''' </summary>
        ''' <param name="query">Sentencia DML de la cual se extraer� la informaci�n</param>
        ''' <param name="campo">Nombre del campo o alias del que se extraer� el dato</param>
        ''' <param name="engloba">S�mbolo que engloba cada elemento en la cadena por ejemplo: "a",+a+,/a/,'a'</param>
        ''' <param name="separador">S�mbolo que separa cada elemento dentro de la cadena por ejemplo:
        ''' a,b,c,d,e
        ''' a;b;c;d;e
        ''' a-b-c-d-e
        ''' </param>
        ''' <returns>Cadena</returns>
        ''' <remarks></remarks>
        Public Function cadenaDeValores(ByVal query As String, ByVal campo As String, ByVal engloba As String, ByVal separador As String)
            Cx.Open()
            CMD = New SqlClient.SqlCommand(query, Cx)
            DR = CMD.ExecuteReader
            Dim cadena As String = ""
            If DR.Read Then
                If DR.Item(campo) Is DBNull.Value Then
                    cadena = ""
                Else
                    If cadena = "" Then
                        cadena = engloba & DR.Item(campo) & engloba
                    Else
                        cadena = cadena & separador & engloba & DR.Item(campo) & engloba
                    End If
                End If
            End If
            Cx.Close()

            Return cadena



        End Function


        Public Sub creaArregloDatosBaseQry(ByRef arreglo() As String, ByVal comando As String, ByVal campo As String)

            Dim indice As Integer
            Cx.Open()
            CMD = New SqlClient.SqlCommand(comando, Cx)
            DR = CMD.ExecuteReader

            While DR.Read
                ReDim Preserve arreglo(indice)
                arreglo(indice) = DR.Item(campo)
                indice = indice + 1
            End While

            Cx.Close()

        End Sub

        ''' <summary>
        ''' Descripcion: Rutina que llena un data table con datos para ser utilizados en la aplicacion sin necesidad de tener abierta una conexion a base de datos
        ''' </summary>
        ''' <param name="tablaDatos">Objeto DataTable que deseamos poblar con informaci�n</param>
        ''' <param name="comando">Sentencia SQL que nos devuelte un grid de datps</param>
        ''' <remarks>Nota importante: Generar un data table con grandes cantidades de informaci�n consume memoria RAM del servidor. Al terminar de usar la informacion del DataTable limpiar el objeto</remarks>
        Public Sub createDataTable(ByRef tablaDatos As DataTable, ByVal comando As String)
            Cx.Open()

            DA = New SqlClient.SqlDataAdapter(comando, Cx)
            DA.Fill(tablaDatos)

            Cx.Close()
        End Sub


    End Class
End Namespace

